package com.algorithm.leetcode;

/**
 * 给出两个 非空 的链表用来表示两个非负的整数。其中，它们各自的位数是按照 逆序 的方式存储的，并且它们的每个节点只能存储 一位 数字。
 *
 * 如果，我们将这两个数相加起来，则会返回一个新的链表来表示它们的和。
 *
 * 您可以假设除了数字 0 之外，这两个数都不会以 0 开头。
 *
 * 示例：
 *
 * 输入：(2 -> 4 -> 3) + (5 -> 6 -> 4)
 * 输出：7 -> 0 -> 8
 * 原因：342 + 465 = 807
 *
 *
 *  public class ListNode {
 *      int val;
 *      ListNode next;
 *      ListNode(int x) { val = x; }
 *  }
 *
 * 思路：使用值为0的节点初始化一个ListNode,并将另一个ListNode的引用指向这个ListNode对象，第一个ListNode用于返回结果（索引位置不变），第二个
 * ListNode（tempNode）用于依次索引到next来存入结果。
 */
public class AddTwoNumbers {

    class ListNode {
        int val;
        ListNode next;
        ListNode(int x) { val = x; }
    }

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

        ListNode dummyNode=new ListNode(0);
        ListNode tempNode=dummyNode;

        ListNode p1=l1;
        ListNode p2=l2;

        //进位
        int carry=0;
        //每位上的数值
        int res=0;
        //每位数字相加的值
        int sum=0;
        while(p1 != null || p2!= null){
            ListNode next=new ListNode(0);

            sum =(p1 == null?0:p1.val) +(p2 == null?0:p2.val) + carry;
            //初始化进位值
            carry= sum / 10;
            res= sum % 10;
            //设置值到结果节点并且移动到下一个节点
            tempNode.next =new ListNode(res);
            tempNode = tempNode.next;
            if(p1 != null) p1 = p1.next;
            if(p2 != null) p2 = p2.next;
        }

        if(carry != 0){
            tempNode.next = new ListNode(carry);
        }

        return dummyNode.next;

    }
}
